Гранање
У овој глави приказаћемо како се могу решавати разни задаци у којима ток извршавања програма зависи од испуњености одређених услова. За такве програме кажемо да имају разгранату структуру и да се у њима врши гранање.
Елементи програмског језика
У наставку ћемо описати елементе језика Пајтон који се користе у програмима разгранате структуре.
Релацијски оператори
Често је потребно утврдити да ли су неке две вредности међусобно једнаке или за неке две вредности утврдити која је од њих већа. За поређење вредности променљивих или израза користе се релацијски оператори.
Основни релацијски оператор је оператор провере једнакости
==
. На пример, ако желимо да испитамо да ли променљивеa
иb
имају исту вредност то се може постићи релацијским изразомa == b
. Вредност овог израза је типаbool
и најчешће се користи приликом гранања (о коме ће ускоро бити речи), али се, такође, вредност релацијског израза може и доделити променљивој. Дешава се да се приликом писања кода направи грешка и уместо оператора провере једнакости==
искористи оператор доделе=
. Напоменимо још и то да поређење два реална броја може произвести понашање које је другачије од очекиваног због непрецизности записа реалних вредности.Поред провере једнакости, можемо вршити проверу да ли су две вредности различите. То се постиже оператором
!=
. Дакле, услов да променљивеa
иb
имају различиту вредност записује се каоa != b
.За поређење да ли је једна вредност мања, мања или једнака, већа, већа или једнака од друге вредности користе се редом релацијски оператори
<, <=, >, >=
.
Очекивано, релацијски оператори су нижег приоритета у односу на
аритметичке операторе, односно у изразу 2+3 == 6-1
би се
најпре израчунале вредности 2+3
и 6-1
а тек
онда би се проверавала једнакост ове две израчунате вредности. Такође
оператори <, <=, >, >=
су вишег приоритета од
оператора ==
и !=
. Сви релацијски оператори су
лево асоцијативни.
Логички оператори
За запис сложених услова користимо логичке
операторе. Логички оператори примењују се на операнде који су
типа bool
и дају резултат типа bool
. Они су
нижег приоритета у односу на релационе и аритметичке операторе.
Оператор логичке конјункције
and
користи се за утврђивање да ли истовремено важи неки скуп услова. На пример, вредност израза2 < 3 && 2 > 1
јеTrue
, а вредност израза2 < 3 && 2 < 1
јеFalse
.Други основни логички оператор је оператор логичке дисјункције
or
. Њиме се утврђује да ли је тачан бар један од датих услова. На пример, израз2 < 3 || 2 < 1
има вредностTrue
, а израз2 > 3 || 2 < 1
вредностFalse
.Оператор
not
даје логичку негацију. На пример, израз!(1 < 3)
има вредностFalse
, која је супротна од вредностиTrue
израза1 < 3
.
Операције логичке конјункције и дисјункције дефинисане су следећим таблицама.
and |
False |
True |
or |
False |
True |
not |
|||
---|---|---|---|---|---|---|---|---|---|
False |
False |
False |
False |
False |
True |
False |
True |
||
True |
False |
True |
True |
True |
True |
True |
False |
Оператор логичке конјункције је вишег приоритета од оператора логичке
дисјункције. Дакле у изразу a or b and c
би се прво
израчунала вредност израза b and c
, а онда би се извршила
операција логичке дисјункције променљиве a
и вредности
претходног израза. Оба бинарна логичка оператора су лево
асоцијативна.
И за оператор конјункције и за оператор дисјункције карактеристично
је лењо израчунавање – иако су поменути оператори
бинарни, вредност другог операнда се не рачуна, уколико је вредност
комплетног израза одређена вредношћу првог операнда. Дакле, приликом
израчунавања вредности израза A and B
, уколико је вредност
израза A
једнака False
, не израчунава се
вредност израза B
; слично, приликом израчунавања вредности
израза A or B
, уколико је вредност израза A
једнака True
, не израчунава се вредност израза
B
.
Наредба if
Већина програмских језика, па и Пајтон, располаже наредбом гранања. Циљ гранања јесте да се на основу испуњености (или неиспуњености) неког услова одреди коју наредну наредбу треба извршити (одатле потиче и назив гранање).
Основни облик наредбе гранања у језику Пајтон је:
if uslov:
naredba1else:
naredba2
У овом случају, ако је испуњен услов uslov
биће извршена
прва наредба, а ако услов није испуњен биће извршена друга наредба.
Наравно, уместо појединачне наредбе, може се јавити и блок наредби
наведен увучено. На пример,
исписивање да ли је дати број паран или непаран може имати следећи
облик:
if broj % 2 == 0:
print("paran")
else:
print("neparan)
Ставка else
није обавезан део наредбе гранања. Дакле,
ако бисмо хтели да испишемо да је број паран ако јесте паран, а ако није
да не исписујемо ништа, то бисмо могли да постигнемо наредном
наредбом:
if broj % 2 == 0:
print("paran")
Условни израз
Уместо наредбе гранања некада је погодније искористити условни израз (израз гранања).
Условни израз има следећу форму:
if uslov else rezultat_netacno rezultat_tacno
Овај оператор је тернарни, односно има три аргумента: први је вредност израза ако је услов испуњен, други аргумент је услов од кога зависи коначна вредност израза, док се трећим аргументом задаје вредност израза ако услов није испуњен. На пример, исписивање парности задатог броја могло би да се реализује и коришћењем израза гранања:
print("paran" if broj % 2 == 0 else "neparan")
Оператор гранања је десно асоцијативан и нижег приоритета у односу на скоро све остале операторе (приоритетнији је једино од оператора доделе).